package com.zenithmind.chat.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 群组类型枚举 - 遵循开闭原则
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
public enum GroupType {
    
    /**
     * 普通群
     */
    NORMAL(1, "普通群", "normal"),
    
    /**
     * 课程群
     */
    COURSE(2, "课程群", "course"),
    
    /**
     * 项目群
     */
    PROJECT(3, "项目群", "project"),
    
    /**
     * 系统群
     */
    SYSTEM(4, "系统群", "system"),
    
    /**
     * 学习群
     */
    STUDY(5, "学习群", "study"),
    
    /**
     * 工作群
     */
    WORK(6, "工作群", "work"),
    
    /**
     * 兴趣群
     */
    INTEREST(7, "兴趣群", "interest");

    /**
     * 类型码 - 用于数据库存储
     */
    @EnumValue
    @JsonValue
    private final Integer code;

    /**
     * 类型名称
     */
    private final String name;

    /**
     * 类型标识
     */
    private final String identifier;

    /**
     * 构造函数
     */
    GroupType(Integer code, String name, String identifier) {
        this.code = code;
        this.name = name;
        this.identifier = identifier;
    }

    /**
     * 根据类型码获取枚举
     * 
     * @param code 类型码
     * @return 对应的枚举值
     */
    public static GroupType fromCode(Integer code) {
        if (code == null) {
            return NORMAL;
        }
        
        for (GroupType type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        
        throw new IllegalArgumentException("未知的群组类型码: " + code);
    }

    /**
     * 根据标识获取枚举
     * 
     * @param identifier 类型标识
     * @return 对应的枚举值
     */
    public static GroupType fromIdentifier(String identifier) {
        if (identifier == null || identifier.trim().isEmpty()) {
            return NORMAL;
        }
        
        for (GroupType type : values()) {
            if (type.getIdentifier().equals(identifier)) {
                return type;
            }
        }
        
        return NORMAL;
    }

    /**
     * 检查是否为系统群组
     * 
     * @return 是否为系统群组
     */
    public boolean isSystemGroup() {
        return this == SYSTEM;
    }

    /**
     * 检查是否为课程相关群组
     * 
     * @return 是否为课程相关群组
     */
    public boolean isCourseRelated() {
        return this == COURSE || this == STUDY;
    }

    /**
     * 检查是否为工作相关群组
     * 
     * @return 是否为工作相关群组
     */
    public boolean isWorkRelated() {
        return this == WORK || this == PROJECT;
    }

    /**
     * 检查是否需要关联外部资源
     * 
     * @return 是否需要关联外部资源
     */
    public boolean requiresExternalResource() {
        return this == COURSE || this == PROJECT;
    }
}
